package Player;

import java.awt.Point;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import GameBoard.GameBoard;
import GameElements.Pawn;
import GameElements.Tile;
import JeuInterfaces.JeuInterfaceGraphique;

public class HumanPlayer extends Player
{
	private static final int START=0, PIOCHE=1, TUILE_POSE=2, PION_POSE=3; 
	private int state = START;
	private Point PosTuilePose;
	
	public HumanPlayer(String name)
	{
		this.name = name;
		this.autonome = false;
		this.id = nbPlayer;
		nbPlayer++;
	}
	
	@Override
	public void play(GameBoard board) 
	{
		finishedPlaying = false;
			
		if(state == START && JeuInterfaceGraphique.getCurrentEvent() == JeuInterfaceGraphique.PIOCHER_EVENT)//si il vien de commencer son tour il peux piocher 
		{
			piocher(board);
		}
		else if(state == PIOCHE)//si il a deja piocher il peux essayer de poser/tourner la tuile
		{
			if(JeuInterfaceGraphique.getCurrentEvent() == JeuInterfaceGraphique.CLICK_GAME_PANEL)
			{
				tryAddTile(board);
			}
			else if(JeuInterfaceGraphique.getCurrentEvent() == JeuInterfaceGraphique.TOURNER_EVENT)
			{
				tournerTuile();
			}
			return;
		}
		else if(state == TUILE_POSE || state == PION_POSE)//si il a deja posé une tuile il peux essayer de poser un pion ou bien de quitter la partie
		{
			if(state == TUILE_POSE && JeuInterfaceGraphique.getCurrentEvent() == JeuInterfaceGraphique.CLICK_GAME_PANEL && pawn.size()>0)
			{
				tryAddPawn(board);
			}
			else if(JeuInterfaceGraphique.getCurrentEvent() == JeuInterfaceGraphique.TERMINER_EVENT)
			{
				terminer();
			}
			return;
		}
	}
	
	
	//ok
	private void piocher(GameBoard board)
	{
		tuilePioche = new Tile(board.piocher());
		state = PIOCHE; 
	}
	//ok
	private void tournerTuile()
	{
		tuilePioche.rotate90();
	}
	//ok
	private void tryAddTile(GameBoard board)
	{
		Point pos = new Point(JeuInterfaceGraphique.getClickedTile());
		
		if(board.canAdd(tuilePioche, pos.x, pos.y))
		{
			board.add(tuilePioche, pos.x, pos.y);
			tuilePioche = null;
			PosTuilePose = new Point(pos);
			state = TUILE_POSE;
		}
		else
			JOptionPane.showMessageDialog(new JFrame(), "Impossible de poser la tuile a cet endroit", "Erreur", JOptionPane.ERROR_MESSAGE);
	}
	//ok pour cette extension
	private void tryAddPawn(GameBoard board)
	{
		Point pos = new Point(JeuInterfaceGraphique.getClickedTile());
		int partTile = JeuInterfaceGraphique.getTilePart();

		if(pos.x == PosTuilePose.x && pos.y == PosTuilePose.y)
		{
			Pawn p = getSelectedPawn();
			if(p==null)
				return;
			if(board.canAdd(p, pos.x, pos.y, partTile))
			{
				board.add(p, pos.x, pos.y, partTile);
				pawn.remove(p);
				state = PION_POSE;
				return;
			}
			else
				JOptionPane.showMessageDialog(new JFrame(), "Impossible de poser la pion dans cette partie de la tuile", "Erreur", JOptionPane.ERROR_MESSAGE);
		}
		else
			JOptionPane.showMessageDialog(new JFrame(), "Ce n'est pas cette tuile que vous venez de poser", "Erreur", JOptionPane.ERROR_MESSAGE);
	}
	
	private Pawn getSelectedPawn()
	{
		String indexStr = "";
		indexStr = JOptionPane.showInputDialog("veuillez donner l'index du pion a utiliser SVP");
		if(indexStr == null)
		{
			return null;
		}
		if(indexStr.equals(""))
		{
			return null;
		}
		else if(!indexStr.matches("[0-9]*"))
		{
			JOptionPane.showMessageDialog(new JFrame(), "Index invalid", "Erreur", JOptionPane.ERROR_MESSAGE);			
			return null;
		}
		int index = Integer.decode(indexStr);
		if(index>pawn.size()-1)
		{
			JOptionPane.showMessageDialog(new JFrame(), "Index invalid", "Erreur", JOptionPane.ERROR_MESSAGE);			
			return null;
		}
		return pawn.elementAt(index);
	}

	private void terminer()
	{
		state = START;
		finishedPlaying = true;
	}
}
